## Понятия

- Coupling (связанность или сцепление)
- Cohesion (связность или целостность)

## Типы связывания

- Связывание через доступ к данным
- Связывание через вызовы
- Событийное связывание

## Описание

Цель: научиться разделять слои абстракций и декомпозировать смешанный код.

## Файлы

* `badServer.js` - пример плохого стиля программирования, все в одном файле,
в одной функции, слои абстракции идут вперемешку.
* `goodServer.js` - пример более хорошего стиля программирования.

## Запуск

Из командной строки можно запустить `node badServer` и `node goodServer`,
для linux/unix систем, нужно использовать `sudo node badServer` и
`sudo node goodServer` потому, что HTTP сервер открывает `TCP 80` порт,
а для всех портов до `1024` нужно иметь специальные права.

## Задание

Нужно понять, что делает `badServer.js` и почему так писать плохо, потом
посмотреть пример `goodServer.js` и понять, где тут уровни абстракции, почему
такой код проще поддерживать и расширять, что делает его не однородным и в чем
преимущество расслоения и проектирования грамотной структры кода.

Теперь нужно переписать `badServer.js`, выделив минимум 2-3 разных слоя
абстракции кода, разнеся их по функциям, или даже по разным файлам.

Следующие функциональные блоки просматриваются в этом коде и их нужно
разделить, понизив их сцепление:

1. Слой доступа к данным (в этом примере - работы с файловой системой)  
2. Парсинг, сериализация и десериализация  
3. Сервер HTTP  
  3.1. Кеширование ответов  
  3.2. Работа с Cookie  
  3.3. Склеивание буфера  
  3.4. Логирование вызовов  
  3.5. Маршрутизация обработки запросов  
4. Бизнес-логика, относящаяся к предметной области  
5. Управление зависимостями  
6. Конфигурирование (например, порт и хост)  
7. Подстановка переменных в шаблоны  

Тут будет полезно декларативно описать задачу в виде структур данных, пример
можно взять из `goodServer.js`.
